import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

/**
 * @author yu
 * @date 2025年04月18日 18:03
 */
public class _20250405_02 {

    private static int countQualifiedPrimes(int n) {
        int count = 0;
        // 遍历所有可能的质数p（p <= n）
        for (int p = 2; p <= n; p++) {
            if (isPrime(p) && n % p == 0) { // p是n的质因数
                if ((long) p * p >= n) {
                    count++;
                }
            }
        }
        return count;
    }

    // 判断一个数是否是质数
    private static boolean isPrime(int num) {
        if (num <= 1) return false;
        for (int i = 2; i * i <= num; i++) {
            if (num % i == 0) return false;
        }
        return true;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        System.out.println(countQualifiedPrimes(n));
        scanner.close();
    }
}


/*
*     public static int count(int n){
        int[] minPrime =new int[n+1];
        List<Integer> primes = new ArrayList<>();
        //欧拉筛法，预处理最小质因数
        for (int i = 2; i < n; i++) {
            if(minPrime[i] == 0){
                minPrime[i] = i;
                primes.add(i);
            }
            for(int p:primes){
                if(i*p > n || p > minPrime[p]) break;
                minPrime[i*p] = p;
            }
        }
        int[] maxPrime = new int[n+1];
        int count = 0;
        for (int x = 2; x <= n; x++) {
            if(minPrime[x] == x){
                count++;
                maxPrime[x] = x;
            }else {
                int p = minPrime[x];
                int m = x / p;
                maxPrime[x] = Math.max(p,maxPrime[m]);
                if((long)maxPrime[x]*maxPrime[x] >= x) count++;
            }
        }
        return count;
    }
* */
